// src/utils/request.js
import axios from 'axios'

const service = axios.create({
  baseURL: '/api',
  timeout: 5000
})

/**
 * setupInterceptors
 * 以函数形式在 main.js 中注入 store accessor，
 * 避免在模块加载阶段直接调用 useXStore()（可能 Pinia 尚未安装）。
 *
 * 参数:
 *   { getUserStore, getToastStore }
 *   这两个都是函数：例如 () => useUserStore()
 */
export function setupInterceptors({ getUserStore, getToastStore }) {
  // 请求拦截（token 注入）
  service.interceptors.request.use(
    config => {
      const token = localStorage.getItem('token')
      if (token) config.headers['Authorization'] = `Bearer ${token}`
      return config
    },
    error => Promise.reject(error)
  )

  // 响应拦截（统一处理格式 & 统一 toast）
  service.interceptors.response.use(
    response => {
      const res = response?.data
      const toastStore = getToastStore ? getToastStore() : null

      if (!res) {
        toastStore?.showToast('接口返回空数据', 'danger')
        return Promise.reject(new Error('接口返回空数据'))
      }

      const code = Number(res.code ?? res.Code ?? 200)
      const message = res.message ?? res.Message

      if (code !== 200) {
        toastStore?.showToast(message || '请求失败', 'danger')
        return Promise.reject(new Error(message || 'Error'))
      }

      // 登录接口兼容返回 token
      if (res.token) {
        toastStore?.showToast(message || '登录成功', 'success')
        return { token: res.token, message }
      }

      // 正常返回，优先返回 data
      return res.data ?? res.Data ?? res
    },
    error => {
      const status = error?.response?.status
      const toastStore = getToastStore ? getToastStore() : null

      if (status === 401) {
        // 清 token 并跳转登录页（不依赖 store.init）
        try { localStorage.removeItem('token') } catch (e) {}
        toastStore?.showToast('登录已过期，请重新登录', 'danger')
        window.location.href = '/login'
      } else {
        toastStore?.showToast(error.message || '网络错误', 'danger')
      }

      return Promise.reject(error)
    }
  )
}

export default service
